ML }  X c0C)HCCH Mhhݩh `eCDiCD`  RyHP   * 1H0芢@) Y0.Ș` i #(PMR\ \b Pgi 0  % @ / ՠ`d   0DDԝL12+&+DSDATHEXLINDATLIDDBYTPASCHKSUTOTAIN@} *** RACE IN SPACE ***I @ 1(MAKE CASSETTE (0), OR DISK (1)}5I!@@ C BC0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,10,11,12,13,14,15(r;@,9@",/-}@"3"<68,-@ L6-A V#A` A r( CHECKING DATA286-%@(LINE:!"8B:,@}A <F%6-F:A,%F:A,$AV+C(LINE  MISSING!FFq-@@@56-@:7< },,&@H[6-@:7%@<%@,,&@Hq6-8,$@%8,P."@*@ $". @PZ% 6- }%!A %6-&Ad  ""@Pn A x F:A,@A "Ap }(A`*@A$)*@@<*@A%O*@@b*@Au*@@G }@<-@@**@. 9@<(Ag+("INSERT DISK WITH DOS, P }RESS RETURN8;@,<g@@ D:AUTORUN.SYS*@AU)*@AU<*@}O*@@2b*@ATu*@@G A{((READY CASSETTE AND PRESS RETURNH@}@A(C:R#A0f-@@@j"w*@{ M(( WRITING FILE#6-@/6-A 9#A}C A M @P(BAD DATA: LINE ``0,33,216,31,255,31,169,0,141,47,2,169,60,141,2,211,169,0,141,231,2,}133,14,169,56,141,232,2//133,15,169,187,133,10,169,47,133,11,24,96cc0000000000000000000000007B3232320000000060A0A0200}07E42427E424200007E404040407E00007C464646,79dd467C00007E407C40407E00007E407C40404000007E40404E427E000042427E42424200007E1}81818187E000040,739dd404040407E00007E424242424200007E42427E404000007E42427E4C4600007E181818181800004242425A5A7E,369dd}000042427E181818007E81BDA1A1BD817E007E424242427E000008080808080800007E027E40407E00007E027E,235dd02027E000042427E020202000}07E407E02027E00007E407E42427E00007E020202020200007E427E42427E0000,361bb7E427E02027E00000000000000000018245A00000000000000}183C3C1800000000003C7E7E7E3C000000007EFF,6$ddFFFF00000000003C7E7E000000000000183C00000000000000180000000000000000000000000}0000000000000,936.dd00000000003C00000000000000FFFFFF7E000000007E7E3C00000000003C180000000000001800000000000000,3078dd00}181818183C7E5A1818183C7EFFDB0000000000000000000042424242427E0000001818001818000042424242,227Bdd241800007E5A5A4242420000464}C78584C4600FFFFFFFFFFFFFFFF7E42420042427E0002020200020202003E02,923Ldd023C40407C003E02023C02023E004242423C020202007C40403C}02023E007C40403C42427E003E020200020202,713Vdd007E42423C42427E007E42423C02023E00706700202727272727272727272727272707C100127}0707046911307,222`dd462F1446B0130606462F1446DF13463E14462F1446EF13467A14462F1446FF1346B614462F14460F1446D41446,281jdd2F}14461F1446F214462F144691134115127070704F0020000F000F000F000F000F000F000F000F000F000F000F,888tdd000F000F000F000F000F000F000}F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F00,218~dd0F000F000F000F000F000F000F000F000F000F000F000F000F00}0F000F000F000F000F000F000F000F000F000F,563dd000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F7}030C700083042,329dd1115415A12187E7EFFFF7E7E18000000555500000015030C030B1308FF2433030803150A0C06FF444D4E465846,960dd4C }4F58FF618E838486808A8C80988D8384860102FF83504E4A4F4F464C405B51FFA0C4C9C3CECBC6D8C0C0DBC3,107ddC4C9C3CCC5FFC51200141C1B17F!}FE6AD8080ADFFF66E40406EFF000000000000000000CDCEC6D8D8C0D3CDCFCA,917ccD3CCC0C000000000000000000075757575757575757575757575"}7575757500130D0F0A130C18C0C0CFF1968075,44dd00534D4F4A534C71408B86878F8075750058464B46444F71CECAC8C9CFC0757500584F434E4F71#}00000D0B0311,159dd0075000F0E0A0808060E31000000000075750085868C988A8F91B1808000000075750098898A8D98B100000000,183dd000$}0007575008493B3868F98B1000000000000757500B08C8AB2868E9886B10000000075750000000000000000,320dd0000000000007500000000CCD3C0%}C6C7C7C6C4CFC075000000000000D8C9CAC6CBC5D8C0750000000000F3CAD8,953ddD8CACBC6D8C075000000D0C3CECDC0C5CECAF2C6C075000000000&}0D8CFC3CCC5C3CEC5C07500000000000000C5,780ddD3F0DBCBC6C07500000000000000CFCECACDCBC6C0750000000000000000D8F0CDC6CEC0750000'}00000000CED3,481ddC4F4C6CFD8C075000000000000D8C3F0C4C6CED8C0750000000000C5CAD8C3DBCBC6C5C075000000000000C6CC,965ccC3D(}BCBC6C5C0750000000000CDD3D8CACFCAF2C6C0750000000000CCC6C8C3CFCAF2C600750000000004130D11,94 dd0E0A08090F001200030C030B13080)}033030803150A0C0600141C1B170000000000001313000000F9F1F6F6E4F6,930dd0000001313000003000000001F1E1A181D1B333530FCF303000301*}010101030003020302020302000000000E0D,842dd34123D1246124F122B123E144D145C146B147A1489149814A714B614C514D414E314F2140115030+}30101010004,508(cc04020200183C3C185A7E5A4200187EDB7E0000000000B66DDBB61020010258A003115030C434003C7E7EFFFFFF,152ddFFFFF,}F7E7E3C00C646F666266CA251404848E683A5140A29CE8DC2026840AD1FD0A8458225828482C904608D02,265<ddD2A9A48D03D2A0C0CAD0FD864D88D0-}F88C03D260A200A9A48D01D28D03D2A912C583D0FC20EB15D00568684CA4,554Fdd17A9008583E88A8D03D029FC8D02D04A4A4AA8B971139939218A0A0.}A0A0A0A49F08D00D21869028D02D28AD0C4,204Pdd8D03D2858560A207A9009D00D0CA10FA60A9008D01D28D03D28D05D28D07D260A93C8D02D3A92B85/}80A9128581,377ZddA9008D08D2A2559582CA10FBA9298D2F02A9038D0FD2A9398D07D4A9028D1DD0A9DE8D0002A9158D0102A9C08D,343ddd0ED4A0}9108DF402A9C68DC502A9948DC602A9048DC302A9018D0AD08D0BD08D6F02205A1685A18586206516AA9D,347ndd00209D00219D00229D003BCAD0F1A21}07BD0A139D283BBD02139DA83BCA10F1E8BD1213F010A8E8BD1213C9FFF0,359xddF1990021C84C0117A9008D3002A9128D3102A9208D0312A9008D0212}2854D8585A9102483F0FC20EB15D0034CA4,577dd17A9008583E684A584186D021245868D00D2A584290769DD8D06228D092269088D16228D1922A5843}C910D03BA9,895dd0085848D05D4E685A586458509808D01D2AD02121869108D0212901EEE0312A922CD0312D0034C8D16200E16A9,919dd208D04}0D2A98F8D01D2A90F8586A5848D05D44C2817A583C583F0FCA9218D2F02A9158D3002A9128D310220281F,582dd205A16854D8D1DD020651685A085A15}A9948DC602A9048592A692BDD4158DC502BDD91520F815C69210EEADFC02,993dd293FA209DD5115F005CAD0F8F01D8A8D4D151869938DAE138A69F686}D4015A9FF8DFC028A0A0A493F20F81520EB,146dd154A90034CA01D4A9024A93020F815A687F689B5893D99159589058E0AAAA000BD7D159180C8BD7E7}1591804CE6,158dd174A909FA91020F815A2018688A5870A0A0A0AAAA00DA9805DE0139DE013E88810F4A588D0034CE617E687A587,327dd0AAAB8}D71158580BD72158581A687BD9E15658E858EA200A587C905D0C18687868E4C4E18A9008593A8A92C8594,767ddA906859160A902858FEC0AD22690069}9006900690C68FD0F1A5909193602094180691A68A20A218C8D0FAE694C6,449dd91D0F4C694A906859188B1934A919398D0F7C694C691D0F160A00A9:}9000A99800A8810F7BDBE1595D49D00D08A,799dd48BDC015AAFE0008BD0008C91D9008A9139D0008FEFF0768AABDC2158D04D2A9AE8D05D2A90385B5;}D6AED004A9,140dd0085ADA9FF8D1ED0608A48A5836AB02EC6B41004A90285B4A6B4BDB6158DAF15293C8DA515BDB715293C8DA615,386ddA5832<}90EAABD5D158D6E15BD5E158D6F1568AA60CE1808105BA9058D1808A5B5F005C6B54C7B198D05D2CE0C08,897ddCE17081042A9FF8D0C08A9098D1708=}A5B5D00AA9A48D05D2A9408D04D2CE0A08CE16081022A9FF8D0A08A9098D,404dd1608CE0908CE15081010A9FB8D0908A9058D1508CE0708CE140808A>}5B505CB05CCD01BA5A825A9F015A5B705B8,644ccF00FA9288D05D2A5834A290709088D04D22860AD09D02901D010AD04D029040D0CD0F00AA5B0C901?}F004A90085,48"ddA8AD08D02902D010AD05D029040D0DD0F00AA5B1C901F004A90085A960B5B7D0FBB5B0C902F00395B260D5B2F0,822,ddEE95B2@}95B718B5D4690285CF95C7B5D685D0E6D095BFF6BF8AF00BA5D4690285CDA5D64C601AA5D5690285CDA5,6586ddD785CEE6CEA90195C195C938A5CEE5DA}095BBB00AA9FF95C155BB95BBF6BB38A5CDE5CF95C5B00AA9FF95C955C5,153@dd95C5F6C5A90095C395B9B5C595BDA90F95CBB5BBD5BD900695BD4A95B}C360B5BD4A95B9604820EB19202D19E683,514Jdd18A5AC693085AC8D02D2A5ADD0034C611CA9088D17D08A48A20FA5A8D0038E7802A5A9D0038E7902AC}D78022D79,451Tdd02C90FA981B00CA5B005B1C903A988B002A9848D07D2A918B002A9208D06D2A20086B6E8AD08D085D2AD09D085,918^ccD3A5B0D}05B1C901D00FAD0AD2291F09208D06D2A9A68D07D220E11CB5A8F034B5B0C901F02E20221AA5836A9006,48hddB5B0C903D0205E7802B002D6D65E7802E}B002F6D6A58BF00E5E7802B002D6D45E7802B002F6D4B5D4C930B002A9,744rdd30C9C89002A9C795D49D00D08492B5A83024A5836AB01D0A29F69DC00F}2A5B5D013A583290709C88D05D2AD0AD2,274|dd291F09208D04D2F6D6B5D6D00320E318C9C0902BB5A8D025B5D4DDBE15F00AF6D4901AD6D4D6D4D014G}A9FF95A8,789dd8D1ED0BDC4159DC002A5B5D0038D05D2A9BF95D6E0016A859B9007A5B61DBA1585B68A4818B5A8F019AD0AD229,511dd0F1DC41H}59DC002B5B0C90138F00718BDC4159DC002A009A209A58BF002A212BDA31590032D0AD2919BCA8810F2,513dd68AAB5B7F006A001A900919BA492CA30I}034C2B1BA5B68D1CD0A5ADF013206519101CA9F68D07088D09088D0A08,147dd8D0C08A979854DA90085AD8D05D28D07D268AAA5A42583F0026840A5AJ}AF0FA98488A48A5A225A7D009A5A51865,640ddA6297F85A5A00DA6A5AD0AD239C6159D000BAD0AD239C6159D800BE88A297FAA8810E6AD0AD229F009K}048DC202,692ddAD0AD229F009088DC30218A5A265A385A28D02D08D03D085AAE6ABA5ADF011A5ABC97DB00E4A4A8D00D2C91890,353dd05499F8L}D01D268AA68A86840BD84024AB002A58935A8D5B0F0038D1ED095B0B5B7F006B5BFD00395B76018B5BB,103dd75B995B9D5BD900BF5BD95B918B5C175M}BF95BF18B5C575C395C3D5BD900BF5BD95C318B5C975C795C7B5CBF012,215dd4A09888D05D2B5CB490F0A0A0A8D04D2D6CBB5C79D04D0B5BF4A90094N}8A5B61DBC1585B6680980859DB5D23D71,480dd15D022B5C7F01E9848A003B19D3D5B1585D1B96D15E001D0020A0A05D1919D8810E968A860A90095B7O}9848A003,556ccB19D3D5B15919D8810F6B5D23D7115F00320F61868A8602065168D1ED0A9FF85A885A9A9408D0ED4A90C8591A9,51bb008593A9P}208594A909859EA9218D6F028D06D2A9018D0AD08D0BD085ADA96385AE85AFA218BD39159D0008CA10,9ddF7A90A859C20281FA9058D0CD0A90085A28Q}5A085AA854D85B585B785B8A89193C8D0FBE694C691D0F5A9BF85D6,579dd85D79899800999000A99000BC8D0F420BA18A201BDBE159D00D095D4CA10R}F5E88EC6028690A92E8D2F028DC502,939ddA9088D07D4A9038D1DD0A9C48DC002A9348DC102A9B08D0002A91A8D0102A95A8D3002A9128D3102A9C08S}D0ED4,667dd20941866909007B1930980189002B1936A9193C8D0F8E694C691D0F2A9068591A9008593A937859488B1932A91,502&dd9398D0F7C6T}94C691D0F12690859585978593A9328596A92C8598A9208594A9EC8599A91F859AA24CA013B19511,8420dd97919391998810F5A595186914859585979U}004E696E69818A593692885939002E69418A599692885999002E69A,507:ddCAD0CB20EB1590034CA4176A90034CA01DA58DF04EA5A0F033202D1FC69FV}A5ADF005A59F4A09A08D03D2A59FF0,109Ddd300A0A0A49FF85ACD02CA5A16A900FA204A90F5DC4029DC402CA10F5C6A160AD0AD2293FD010202D1FA91W}F859F,898Ndd85A0D00585A08D03D2A58CF004A5AAF0034C6A1EAD0AD2293FD0F685A4AA9D000BCAD0FA8D02D08D03D085ABAD,816Xdd0AD22903C9X}03B0F785A6C6A6AD0AD22903AAA91F4ACA10FC85A7A5ADF002A9888D01D2AD0AD2293F691085A5A2,336bddFE86AAAD0AD21002A20286A3AD0AD210A6EY}6A44C6A1EA9208596A9108598AAA90085958597A8B195919788D0F9,189lddE696E698CAD0F24C74160000000000000000000000000000000000000000Z}000000000000000000000000000000,817 D2:RACE.BAS9,189lddE696E698CAD0F24C7416000000000000000000000000000000000000000064+dX; +---------------+nX; | RACE IN SPACE |xX; +---------------+X; X; Written by Charles BachandX;\}ORIGINX;X; Game Playfield AreaX; -------------------X;DRAMORIGINMRAMDRAMASTRPAGES]}DRAMASTLPAGESASTRX;X; Player/Missile AreaX; -------------------X;",X;6PM ;;blank ^}space@PMM ;;missilesJPM0 ;;player 0TPM1 ;;player 1^PM2 ;;player 2hPM3 ;;player 3rX;|X;_} System EquatesX; --------------X;TRAMPM;;PM blank spaceCHBAS;;char base regCH;;last key press`}VSCROL;;vertical scrollNMIEN;;interrupt ctrlVDSLST;;DLI vectorSDMCTL/;;DMA enableSDLSTL0;;a}display listCOLOR0;;color reg 0COLOR1;;color reg 1COLOR2;;color reg 2COLPF1;;color playfld 1b}DLI;;DLI flagATRACTM;;attract mode&RTCLOK;;real time clock0PCOLR0;;player color 0:PCOLR1;;plac}yer color 1DPCOLR2;;player color 2NPCOLR3;;player color 3XGPRIORo;;prioritybSIZEP2 ;;size player 2ld}SIZEP3 ;;size player 3vHPOSP0;;pos player 0HPOSP2;;pos player 2HPOSP3;;pos player 3HPOSM0e};;pos missile 0SIZEM ;;missile sizeVDELAY;;vertical delayGRACTL;;graphics ctrlCONSOL;;consolef} keysPMBASE;;P/M base addrAUDF1;;audio freq 1AUDF2;;audio freq 2AUDF3;;audio freq 3AUDF4g};;audio freq 4AUDC1;;audio volume 1AUDC2;;audio volume 2 AUDC3;;audio volume 3AUDC4;;audio h}volume 4 AUDCTL;;audio control*SKCTL;;serial ctrl4RANDOM ;;random number>STRIG;;joystick trig 0Hi}STICKx;;joystick 0RPAGES;;scrn block size\P0PF;;P0/PF collisionfP1PF;;P1/PF collisionpM0PL;;M0j}/PL collisionzM1PL ;;M1/PL collisionP0PL ;;P0/PL collisionP1PL ;;P1/PL collisionHITCLR;;collisionk} clearPACTL;;port A controlX;X; Page Zero equatesX; -----------------X;X; SELPNT ;;menu sl}elect pntCONSAV ;;console saveCLOCK ;;local clockSLINE ;;scroll line cntVOLUME ;;intro volumem}DIRSW ;;vol direction$ OPTION ;;OPTION key indx.OPTSW ;;OPTION switch8TRIG ;;Trigger optionBDEn}NS ;;starfield densLSHIP ;;ship typeVCOME ;;comet enabled`UNIV ;;inverse univjSOFSET ;;SELECTo} offsettTEMP ;;temp registers~ GRPAGE ;;screen pointer GRP1 ;;asteroid leftGRP2 ;;asteroid rightp}GRP20P ;;scrn pntr -20GRPX ;;player gr pntrGRPM ;;missile gr pntr FLASHC ;;univ flash cntr q}FLASHF ;;univ flash flagREVF ;;inv univ flagHPOS ;;comet H posHDIR ;;comet H dirHINC ;;cor}met H speedVPOS ;;comet V posVDIR ;;comet V dir VINC ;;comet V speedDEAD ;;dead ship flgCOs}METF ;;comet set flag(CSOUND ;;comet snd cntr2UNIVS ;;universe sound<ENDGAM ;;game over flagFSCORt}ES ;;game scoresPTRIGN ;;processed trigsZTRIGS ;;last triggersdROTATE ;;rotate indexn SCLOCK ;u};score snd timerxVDEL ;;vert delayMISSLE ;;shot flagsROWAC ;;shot row accDELTAR ;;shot delta rv}owENDPT ;;shot end point ROWCRS ;;shot row cursorROWINC ;;shot row incCOLAC ;;shot column accw}DELTAC ;;delta columnCOLCRS ;;column cursor COLINC ;;shot column incCOUNTR ;;shot delta cnt x}NEWCOL ;;shot end columnNEWROW ;;shot end row OLDCOL ;;shot old columnOLDROW ;;shot old rowTEMy}PM ;;shot temporary"M0PLS ;;M0 col shadow,XPLR ;;ship X coords6YPLR ;;ship Y coords@X;J ORIGINTz}X;^"X; Redefined Character Set Datah"X; ----------------------------rX;|!CHARS ======= ==={}={=2=2=2 ====`===  =~=B=B=~=B=B= =~=@=@=@=@=~= =|=F=F=F=F=|= |}=~=@=|=@=@=~= =~=@=|=@=@=@= =~=@=@=N=B=~= =B=B=~=B=B=B= =~=====}}~= =@=@=@=@=@=~= =~=B=B=B=B=B= =~=B=B=~=@=@= =~=B=B=~=L=F= =~=~}===== =B=B=B=Z=Z=~=& =B=B=~====0 ~===: ===~D =~=B=B=B=B=~=}N =======X =~==~=@=@=~=b =~==~===~=l =B=B=~====v =~=@=~=}==~= =~=@=~=B=B=~= =~====== =~=B=~=B=B=~= =~=B=~===~= }======= =$=Z===== ===<=<=== ===<=~=~=~=< ====~==}= =====<=~=~ =======< ======= ======= ===}====  ======= <=======  ===~====* ~=~=<=====4} <=======> =======H =====<=~=ZR ===<\ ~===f ====}===p =B=B=B=B=B=~=z ======= =B=B=B=B=$== =~=Z=Z=B=B=B= =}F=L=x=X=L=F= === === ~=B=B==B=B=~= ======= >===<=@=@}=|= >===<===>= B=B=B=<==== |=@=@=<===>= |=@=@=<=B=B=~= >==}=====  ~=B=B=<=B=B=~=  ~=B=B=<===>= X;$ X; Introduction Display List. X; -------------}------------8 X;B DISPI p=gL DADR DRAMV  '='='='`  '='='='j  '='='='t  '==ADLI~ DISPI X; }X; Game Options Display List X; ------------------------- X; DISPO p=p=p=F OPTMSG =F  SB  F  O}L1 ==F  SB  F  OL2  F DOT TOPT(  F2  SB<  FF  OL3P  FZ DOD DOPTd  Fn  SBx  F  O}L4  F DOS SOPT  F  SB  F  OL5  F DOC COPT  F  SB  F  OL6  F DOU UOPT  F"  S}B,  F6 OPTMSG@  AJ DISPOT X;^ !X; Game Playfield Display Listh !X; ---------------------------r X;| DISPG p=p}=p=O DRAM  ======  ======  ======  ======  ===}===  ======  ======  ======  ======  =====}=  ====  p=0=GDLI TRAM 0=B ANALOG&  A0 DISPG: X;D !X; Flying saucer in Intro DataN }!X; ---------------------------X X;b SAUCER =~=~=l  =~=~=v WINDOW ===U  U=== X; X; Rede}fined Char Set Equates X; -------------------------- X; TMC AC CC DC EC FC GC } HC  IC LC  NC PC * RC4 TC> WCH YCR CRC\ N0Cf BCN0Cp OCN0Cz} SCOC SMKN0C SMK2SMK SHCSMK2 MTSHC UCMT COLCUC VCCOLC MCV}C KCMC BXKCA N7CKC X; X; Introduction Title DataX; -----------------------X;TITLE =}AC=NC=AC=LC$ OC=GC==$=MC. AC=GC=AC=N0C=IC8 NC=EC==DB @=PC=RC=EC=SCL @=EC=NC=TC=S}CV =a` =RC=AC=CC=EC=j =IC=NC==SC=PCt =AC=CC=EC~ TMC=TMC== @=WC=RC=IC=T}C=TC=EC @=NC==BC=YC = =CC=HC=AC=RC=LC=EC =SC===BC=AC=CC =HC=AC=NC=DC} ==CRC= N0C=N0C =N0C N0C== =SHC===SHC = @=SHC===SHC } X;X; PRESS OPTION Message DataX; -------------------------(X;2#PMSG ========< =PC=RC=}EC=SC=SCF ==OC=PC=TC=ICP =OC=NC==Z ========dX;nX; Options Screen DataxX; --}-----------------X;*OPTMSG BX=BX=BX=BX=BX=BX=BX=BX# BX=BX=BX=BX=BX=BX=BX=BX" BX==OC=PC=TC=IC}=OC=NC SC ===TC=COLCTIMOPT =N0C=OL1 BX= @=OC=PC=TC=IC @=OC=NC=COLC=} =LC=EC=FC=TC= BX=BX= @=SC=EC=LC=EC=CC @=TC=COLC =RC=IC=GC=HC=TC= BX=BX=}" @=SC=TC=AC=RC=TC, @=COLC6 ==PC=LC=AC=YC=@&OL2 BX==TC=RC=IC=GC=GC=ECJ RC=COLC==}====BXTOL3 BX=^ =DC=EC=NC=SC=IC=TCh =YC=COLC==r ===BX|OL4 BX= =SC=}HC=IC=PC=SC =COLC =======BXOL5 BX= =CC=OC=MC=EC=TC =SC=COLC ==}====BXOL6 BX= =UC=NC=IC=VC =EC=RC=SC=EC=COLC ====BXSB BX======}= ======TOPT BX==== =NC=OC==EC=FC=FC =EC=CC=TC=&TOPT2 BX===}===0 =SC=HC=IC=EC: =LC=DC=SC=DTOPT3 BX=====N =MC=IC=SC=SCX =IC=LC=E}C=SC=bTOPT4 BX===l =WC=AC=RC=PC=v =DC=RC=IC=VC=EC=DOPT BX===== =SC=}TC=AC=NC =DC=AC=RC=DC="DOPT2 BX======= =DC=OC=UC=BC=LC =EC="DOPT3 BX}======= =TC=RC=IC=PC=LC =EC=%DOPT4 BX======== =SC=UC=PC=EC=R}C=SOPT BX====== =RC=OC=CC=KC =EC=TC=SC= SOPT2 BX====== =SC=AC}=UC=CC=EC  =RC=SC=*COPT BX=====4 =DC=IC=SC=AC> =BC=LC=EC=DC=HCOPT2 BX==}====R =EC=NC=AC=BC\ =LC=EC=DC=fUOPT BX=====p =PC=OC=SC=ICz =TC=IC=V}C=EC=UOPT2 BX===== =NC=EC=GC=AC=TC =IC=VC=EC =BX&ANALOG ====CC=OC=P}C=YC RC=IC=GC=HC=TC= CRC==AC=NC=AC=LC OC=GC==MC=AC=GC=AC" N0C=IC=NC=EC==N0C} N0C =N0C=N0C ==="TRAMI ==N0C=N0C=== TRAMC =N7C=COLC=N7C =N7C=SMK}=N7C ===N0C=N0C==TRAMN ====$NUMMSK ===. ==3=5=08MISMSK =B"MISIMA }=======L =======VMIMAGE ===`MCMSK = j!LADR DOD=DOS=DOC=DOU=DOTt#MA}DR TOPT=TOPT2=TOPT3=TOPT4~ DOPT=DOPT2=DOPT3=DOPT4 SOPT=SOPT2=COPT COPT2=UOPT=UOPT2SELMSK ===}=SELMS2 ====SHIPS ==<=<= Z=~=Z=B ==~= ~=====ROTMSK =m==}VDMSK = ==XSTRT X=SCPNT =SCNOTE P=0 PCOLRS =4COMETM =<=~=~ ====(} =~=~=<=2CE3K =F==f=&<CE3KN l==Q=@=HP=0 PCOLRS =4COMETM =<=~=~ ====(@N@  )?HI Y0`HIJH) * J j * hJJJ )HJ h i     } YS S0 i`΢ϣ߳H J3xj2h} 1 |9 ӭ45(420 * (0241өX.`  R *i)Lvw  ~*P}E 5 LN(G E  r s k rsrL ( E LO(0d( L iE0O +)$IC  H S8 }q p h   j 8no CDLQ CFl M  LO Ri)Llk2'")*F}$F$F$F$F$ 5 )ШF/Șl]kpqС,LQ/A! Ti)Zlk@ ܬ/i)(")")k}$F$F$F 5$/L /lF@jj(LNkle$$%8(k()` R 8 ELO Ri)^>jf | NrC s } ) vw5g   enfo Glvw LQ@iLm>j FL ~Jjjjii p qEh}jlrs`LQ:$ȱ$@+[_#{ 8  Խut! ai 8   E I   ] C} H h    ˰ 8  N   Lm E  ,  [ `LQ ,/ 8 ~/  Ơ? ѩ}/  [ /Lj0?MoLn FjMqLp NklLOLQnLoMlNLO R"(+}ըHH`Q R!!  % !   / .   FȑF! /GF \H"+0+* }! F tLQnm: J~nTF1F  *n+)5! n (, n)1JJJn(n*o} I ,0  ci a oF? @ , 8,0 ʩ0H Eh   i}  D ]DmmFLQvtu`*&!*@h ] 0 ^0` c 0l$$%}()()%*&J%H,@hH hH@,h $% 8i8$(%)0hhH ]h`() c 0H c 0 h}`hhh&JJ ](ll  LQ0  /qnoHH 9 9 H H  I9  9 } Nd EH  Q8 o n  FnoL HII/ Ih8`h`Lnon`no`u F }E VEhLO/luF l0BF/lɜɛ׽hE N  b VFL FREE SECTORS C} H) *Fh ):FȽ F FC IH' 0 d  i:Fȩ/F.l`CD/08HDIC}IHȰ/F`ȱ$>.+.i ȱ$:刄H !A \ Hȱ$*?ȝ 2. ? [_{ ,0}-:) 0$:>WI  IТ,LQH  0hLd ~ t u`C ?( 0(C.` E } R =! .ti S0N EE D XC )0')AY  )ע ? 0E088FG \o}n  (HhLcL3 iJ i Lqp 0=rspnqopqlk`jZj0  j FL`H}FhȑFȽlFi0 h FFLFpvqwgneofLF pq7  G0i 0 FJJh1FqȱFpȱFk`B!}08`hEE D 8. =D}tui( TʩL`b!)    cȌaȌd b`aab}H8 hdaHcd8 cH hHH  \h hc` =Hh I8ih( t  ( t(!` L\}CJfCJfCJfCDfC` a  HII  INdh  `h  `n)8jHniPoijIjFIjFIjh` a} I 38  8H0 I  ' H LQ8j Y  8j NdY  &I &I &IHeH.p}Iiq  `!.莿 2Jjj }.m Ȉ!m FG` ɩLQ z } e Hi04 \ Ȍ  8 i h !`I0 `C Y8.`DOS SYS} I  ` ~ݩ.C/`ba.m۩mѤC9 `C L] H  ,- '0 l }, BLVDE`D1:AUTORUN.SYS8hhJ ȱHȱIȱBȱDȱEeeHHLV)  }1*  ,,p-  0 I &  '0   Lw)l, 0  I&LD1:MEM.SAV}E:D1:DUP.SYS';Cu0Gq0.p𗓤M`7ؓ*[e/d0Iq'Lq>b} D  C D     )16CS S)  C)D1 p p }0 C9DI pCDL~CiCDiD` DD˙` d J)L !}D L(( LL()  L| L( S LH 0p n  } CY?  q  L L  ` )} `A! d߰")-݆ "  $G@LLL&0") $G%}H0 3S8`G ȱG ȱG   Gȭ Gȭ GG}GHiH8(()) G$H% `(0})8` d)L ݆ & LGȘ ݆LL d  ! LL d)N>Q  HH)}  hyhyB q L> Lm JJ  Ln*` dB%'}8  H H` 1 { LL   !L     Hh SY?  q  1L}  !? S   q 1 L   Ll  Lg E`L   !L)  q 1L}) `L0AM݊L݉ ML  N݆LLLNLMLHG!@}1F GȱGLLEEȩÑEȑEEȑE Ed E7EȩE  q} L !,0,0SGɛ L 1 !L EHEh W G gLLSROTCES EERF } G) *Gȩ GȽG GȌd q q G`  8   0G  `D}CEDC0X:Ȣ Y ȱC* ? 0.. , 0%n ?A[ 0 : L`L  `, 0`Y}`piH n0)բY? 08`0 }  0$L GGȽG L `8L`L}8`  05G)݁,G)ȱGȱGHh0})Hh` B! 8`8iiiLE`}E8FEh( l0`ɃLL L8^~jj8jHi hEEEiEȱEiE` dTE} H8EEȱEEȩEh J E8   . m  i`LI!)E1FR}1LJ舩9GIH`LJJ`HGHh l`} S gL   8 rii `дCDCG W  }C  Lq` X٨`DOS SYS IIIIIIIIIIIIIIIC`0 ߩ0}}} HE |||||DOS DOSDOS SYS }}}} }CDOS SYS} 0`BDELV !B }`LVUQ   ]   TU J ]L!T  #      TU } L ? .  t`GBJ V~DEHI B V0dV}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh}DEL8HI   0 HI,0 0  9 .G VLO},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHI} V0 0`B;DELV䌚 !B y`@ʆ v s? F0Ξ05: [ BDEHI} VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO }STILL RUN DOS B;DE J V (` 9 V⪍ ઍ  -}LLu DEHILV 9 .l 9 .l  `` s$B VBH}I|DE V BLV nB,DE J V* \*` B V BLVDEHI BLVL}1u H232435; 1 ;  hh@2 e1i1LHҍ 00) 08 109hh@ Ҡ2e}1i1232435ޥ<<8} dX;nX; DLI RoutinexX; -----------X;DLIVEC5;;save Acc#CLOCK;;increment clockQRTCLOK;;system clockT }?;;times 2M>;;mask colorPPCOLR2;;saucer color7;;restore Acc 9;;returnX;X; Console CheckerX; ---------- }-----X;CONCQCONSOL;;get console?;;to Y registerNCONSAV;;only different"MCONSAV;;pressed keys,'CONSAV;;sa }ve current6R>;;OPTION test@ :;;returnJX;TX; Beep Routine^X; ------------hX;rBUZZERPAUDF2;;buzzer freq|Q> };;pure tonePAUDC2;;in tone 2%>;;beep counterBZ0;;decrement XHBZ;;zero yet? No.&ATRACT;;poke attract1; };decrement YHBZ;;tone done? No.'AUDC2;;Yes. turn off :;;returnX;X; Flying Saucer RoutineX; --------------- }------X;DELAY$>;;get zeroQ>;;pure tonePAUDC1;;enable tone 1&PAUDC2;;enable tone 20DL1Q>;;1/5 sec co }unt:DL2RCLOCK;;compare clockDHDL2;;match? No.N CONC;;check consoleXHDL3;;OPTION key? No.b7;;Yes. pull RTSl7; };addr from stackv!STOPTS;;options menuDL3Q>;;get zeroPCLOCK;;init clock2;;inc saucer posA;;move to AccP }HPOSP3;;move saucerM>;;window movementPHPOSP2;;do windowsV?;;times 2V?;;times 4V?;;times 8?;;index to d }isplaQPMSG8;;get textPDRAM98;;on screenA;;saucer position T?;;times 2T?;;times 4 T?;;times 8*T?;;times } 164T?;;times 32 whew!>N>;;inverse hi bitsHPAUDF1;;saucer soundR,;;clear carry\O>;;weird soundfPAUDF2;;with } resonancepA;;saucer positionzHDL1;;off screen? No.PAUDC2;;sound 2 offPVOLUME;;saucer volume :;;returnX; }X; Move All P/M Off ScreenX; -----------------------X;CLRPM$>;;8 objects 0-7Q>;;zero positionCPMPHPOSP0 }9;;move P/M0;;decrement countICPM;;done? No. :;;returnX;X; Turn Off All SoundX; ------------------$X;. }AUDOFFQ>;;get zero8PAUDC1;;sound 1 offBPAUDC2;;sound 2 offLPAUDC3;;sound 3 offVPAUDC4;;sound 4 off` :;;returnj }X;t#X; Program Execution Starts Here~#X; -----------------------------X;RISQ><;;cassette offPPACTL;;poke hard }wareQ>4DOT;;density loPSELPNT;;select point loQ>5DOT;;density hiPSELPNT;;select pnt hiQ>;;init sound }PAUDCTL;;audio control$>YPLRCONSAVI1PCONSAV9;;zero flags0;;decrement indexII1;;done? No. X;X; Sy }stem Reset Returns HereX; -------------------------(X;2INTROQ>);;value to enable<PSDMCTL;;narrow playfldFQ>;; }value to turnPPSKCTL;;off 2-tome modeZQ>5MRAM;;high byte ofdPPMBASE;;P/M addressnQ>;;value toxPGRACTL;;enable } playersQ>4DLIVEC;;DLI addr loPVDSLST;;DLI vector loQ>5DLIVEC;;DLI addr hiPVDSLST;;DLI vector hiQ>;;v }alue toPNMIEN;;enable DLI'sQ>5CHARS;;addr ofPCHBAS;;character setQ>;;value forPCOLOR1;;medium greenQ> };;value forPCOLOR2;;dark blueQ>;;value forPPCOLR3;;dark greyQ>;;value - playerPSIZEP2;;double width" }PSIZEP3;;players set,PGPRIOR;;PL has priority6 CLRPM;;remove PLayers@PREVF;;rev screen flagJPDIRSW;;sound direc }tionT AUDOFF;;sound off^>;;zero indexhI2PDRAM9;;clear displayrPDRAM9;;page 2|PDRAM9;;page 3PMRAM }9;;player 2+30;;decrement indexHI2;;done? No.$>;;move 8 bytesI3QWINDOW9;;saucer windowsPMRAM(9;;pla }yer 2QSAUCER9;;saucer shipPMRAM9;;player 30;;decrement indexII3;;saucer done? No.X;X; Print Text Ont }o DisplayX; -----------------------X;PTITL2;;increment indexQTITLE9;;get text&FSTITL;;byte zero? Yes.0?;;d }isplay index:P22;;inc text indexDQTITLE9;;get textNR>;;EOL flagXFPTITL;;EOL? Yes.bPDRAM8;;on screenl3;; }inc displa indxv!P2;;continueX;X; Scroll Text For IntroX; ---------------------X;STITLQ>4DISPI;;DL addr l }oPSDLSTL;;DL pntr loQ>5DISPI;;DL addr hiPSDLSTL;;DL pntr hiQ>5DRAM;;screen top hiPDADR;;DL LMS hi }Q>;;get zeroPDADR;;DL LMS loPATRACT;;poke attractPVOLUME;;clear volume S1Q>;;16/60 sec countS2*CLOCK };;check clock FS2;;time up? No.* CONC;;console keys4HS2A;;OPTION key? No.>!STOPTS;;option menuHS2AQ>;;get ze }roRPCLOCK;;reset clock\#SLINE;;inc scroll cntfQSLINE;;scroll countp,;;clear carryzODADR;;screen addr loNDIR !}SW;;sound directionPAUDF1;;rocket soundQSLINE;;scroll countM>;;use only 0..7O>SMK;;smoke offsetPDRAM "};;put below bothPDRAM ;;rocket shipsO>;;botm smk offsetPDRAM;;put below topPDRAM;;smoke of shi #}psQSLINE;;scroll countR>;;check overflow?HS3;;No. continue Q>;;get zero PSLINE;;reset count PVSCROL;;v $}ertical scroll$ #VOLUME;;raise volume. QDIRSW;;sound direction8 NVOLUME;;EOR with volumeB L>;;rough soundingL PAUD %}C1;;rocket soundV QDADR;;DL LMS lo` ,;;clear carryj O>;;line widtht PDADR;;new DL LMS lo~ DS3;;overflow? No. #DA &}DR;;inc LMS hi Q>5DRAM;;cmp scrn end RDADR;;with LMS hi HS4;;at end? No. !INTRO;;Yes. do intro S4 DE '}LAY;;flying saucer Q> ;;value for PAUDF1;;reset frequency Q>;;full volume PAUDC1;;reset tone Q>;;reverse sou (}nd PDIRSW;;sound direction S3QSLINE;;scroll count PVSCROL;;vertical scroll !S1;;continue X;( X; Game Option M )}enu Routine2 X; ------------------------< X;F #STOPTSQCLOCK;;allow one VBLANKP STPRCLOCK;;period to go byZ FSTP;;bef *}ore startd Q>!;;value forn PSDMCTL;;narrow playfldx Q>4DISPO;;DL addr lo PSDLSTL;;displa list lo Q>5DISPO;;DL add +}r hi PSDLSTL;;displa list hi  SCRCLR;;clr inv Univ  CLRPM;;clear players PATRACT;;poke attract PGRACTL;;no ,}players  AUDOFF;;sound off PFLASHF;;clr flash flag PREVF;;clr inv flag Q>;;color value for PCOLOR2;;medium bl -}ue Q>;;five notes 0-4 PTEMP;;same index STS$TEMP;;get index QCE3K9;;get color" PCOLOR1;;change color,  .}QCE3KN9;;get note6  BUZZER;;play note@ "TEMP;;dec indexJ ISTS;;done? No.T ST1QCH;;check keyboard^ M>?;;mask CT /}RL/SHIFTh $> ;;check for 0-9r !ST1ARNUMMSK9;;cmp keycode| FST1B;;numeric? Yes. 0;;decrement index HST1A;;done? 0}No. FST1C;;Yes. continue ST1BA;;index is number PTRAMN;;store time ,;;clear carry O>N0C;;display offset P 1}TIMOPT;;show time opt A;;number again O>N7C;;2nd char set PTRAMC;;game score line Q>;;clear the PCH;;keyboa 2}rd buffer A;;number again T?;;times 2 T?;;times 4& N>?;;inverse here to0  BUZZER;;number sound: ST1C CONC;;check 3} consoleD V?;;check START keyN DST2;;START key? No.X !PLAYGM;;Yes. play gameb X;l X; SELECT Key Handlerv X; --------- 4}--------- X; ST2V?;;check SELECT DST3;;SELECT key? No. Q>0;;Yes. do SELECT  BUZZER;;key noise $OPTION;;opt t 5}o change #TRIG9;;inc option byte QTRIG9;;get option byte MSELMSK9;;mask overflow PTRIG9;;save opt byte LSOFSET 6};;SELECT offset T?;;times 2 >;;use as X index %>;;zero Y index QMADR9;;text addr lo P@SELPNT7;;LMS byte lo 3; 7};inc Y index* QMADR9;;text addr hi4 P@SELPNT7;;LMS byte hi> !ST1;;continueH X;R X; OPTION Key Handler\ X; ------- 8}-----------f X;p ST3V?;;check OPTIONz DST1;;OPTION key? No. Q>;;Yes. do OPTION  BUZZER;;key sound $>;;reset t 9}ext flag ST4&OPTSW;;option switch QOPTION;;option counter T?;;times 2 T?;;times 4 T?;;times 8 T?;;times 16 > :};;use as index %> ;;do 14 bytes ST4AQ>;;get sign bit NOL29;;flip signPOL29;;save byte2;;increment ind ;}ex1;;decrement count$IST4A;;done? No..QOPTSW;;option switch8HST4B;;flipping done?B!ST1;;Yes. continueL!ST4B# <}OPTION;;inc option cntrVQOPTION;;option counter`T?;;times 2j>;;use as indextQLADR9;;DL LMS addr lo~PSELPNT;; =}select pntr loQLADR9;;DL LMS addr hiPSELPNT;;select pntr hi$OPTION;;option counterQSELMS29;;offset tabl >}eOSOFSET;;present offsetPSOFSET;;new offset$>;;get zeroQOPTION;;option counterR>;;range: 0..4HST4;; ?}overflow? No.&OPTION;;reset counter&SOFSET;;reset offset!ST4;;continueption counterR>;;range: 0..4HST4;; RnX;x X; Asteroid Field Initializer X; --------------------------X; Initialize pointersX; -------------------A}X;"LDGRRTQ>4ASTR;;asteroid rightPGRPAGE;;field addr lo?;;use as indexQ>5ASTR;;asteroid rightPGRPAGE;;fB}ield addr hiQ>PAGES;;# of 256 bytePTEMP;;blocks to move :;;returnX;#X; Generate Asteroid Field Bytes#X; -C}----------------------------X;"RANWRDQ>;;# 4-bit nibbles,PTEMP;;save counter6RANW0(RANDOM;;with density@UTED}MP;;carry to bit 0JTTEMP;;to bit 1TTTEMP;;to bit 2^TTEMP;;to bit 3h"TEMP;;nibble countrHRANW0;;bytE}e done? No.|QTEMP;;move byte toP@GRPAGE7;;graphic area :;;returnX;"X; Fill Workspace With Graphics"X; ----F}------------------------X;!RANFIL LDGRRT;;init pointersTTEMP;;blocks times 2$DENS;;get density!RANF0 RAG}NWRD;;make starfield3;;inc block indexHRANF0;;block done? No.#GRPAGE;;inc page pntr"TEMP;;dec block cntrH}HRANF0;;done? No.X;&X; Shift ASTR Space To Right0X; -------------------------:X;D"GRPAGE;;dec page pntrNI}Q>PAGES;;get block countXPTEMP;;store countbRANF11;;dec indexlQ@GRPAGE7;;asteroid bytevV?;;force to oddP@GJ}RPAGE7;;replace byteC;;exam indexHRANF1;;index=0? No."GRPAGE;;back up pntr"TEMP;;decrement countHRANK}F1;;Done? No. :;;returnX;X; Ship Scoring RoutineX; --------------------X;SCORE%> ;;clr top 16 bytesSC0L}PPM08;;of player 0PPM18;;and player 1 1;;decrement indexISC0;;done? No. QXSTRT9;;start position*PXPLR9;;to pM}layer pos4PHPOSP09;;set hardware>SCOREMA;;save X to AccH5;;push AccRQSCPNT9;;score Y pos\>;;use as indexf#TRAN}M9;;increment scorepQTRAM9;;get score bytezR>N0C ;;value over 9?DSC1;;No. skipQ>N0C;;get zero charPTRAM9;O};to 1's position#TRAM9;;inc 10's posSC17;;pull Acc>;;get X indx backQSCNOTE9;;score soundPAUDF3;;set frP}equencyQ>;;loud soundPAUDC3;;set volumeQ>;;value forPSCLOCK;;sound duration"SCORES9;;dec max scoreHQ}SC2;;from 99 to zeroQ>;;99 points soPENDGAM;;end the game$SC2Q>;;value to return.PHITCLR;;clear collision8 R}:;;returnBX;LX; Ship Graphics RotationVX; ----------------------`X;jROTORA;;move X to Acct 5;;save X~QCLOCK;;gS}et clockW?;;test bit 0ERT2;;bit=1? Yes."ROTATE;;rotation indexIRT1;;rotate<0? No.Q>;;reset value forPT}ROTATE;;rotation indexRT1$ROTATE;;get indexQROTMSK9;;spinner graphicPSHIPS ;;saucer sectionM><;;mask for rU}ocketPSHIPS;;rocket upperQROTMSK9;;next seqM><;;mask for rocket PSHIPS;;rocket lowerQCLOCK;;get cV}lock againM>;;missile mask(>;;use as index2QMISIMA9;;missile image<PMIMAGE;;image bufferFQMISIMA9;;missW}ile pic+1PPMIMAGE;;image buffer+1ZRT27;;pull Accd>;;restore Xn :;;returnxX;X; Countdown Timer HandlerX; -X}----------------------X;"TIMER"TRAM;;1/10 sec timerITMX;;time up? No.Q>;;Yes. value toPTRAM;;reset Y}timerQSCLOCK;;tic sound clockFRT3;;tic done? Yes."SCLOCK;;dec tic clock!RT4;;continueX;RT3PAUDC3;;ticZ} sound off!RT4"TRAM ;;1/10 sec displa"TRAM;;1/10 sec cntrITMX;;1 sec done? No."Q>N7C;;value to reset,[}PTRAM ;;1/10 sec displa6Q> ;;value to reset@PTRAM;;1/10 sec cntrJQSCLOCK;;sound clockTHRT5;;in use? Yes.^\}Q>;;value forhPAUDC3;;pure tonerQ>@;;value for|PAUDF3;;medium freqRT5"TRAM ;;one's display"TRAM;;on]}e's counterITMX;;10 sec up? No.Q>N7C;;value to resetPTRAM ;;one's displayQ> ;;value to resetPTRAM^};;one's counter"TRAM ;;ten's display"TRAM;;ten's counterITMX;;minute up? No.Q>N7C;;value to resetP_}TRAM ;;ten's displayQ>;;value to resetPTRAM;;ten's counter"TRAM;;minute display"TRAM;;minute cou`}nter&TMX6;;save flags0QSCLOCK;;if score sound:LCOUNTR;;or missile 0/1DLCOUNTR;;active?NHTMXX;;Yes. skip nexa}tXQDEAD;;either ship 0bMDEAD;;or ship 1lFTMXX;;dead? Yes.vQMISSLE;;OR flags forLMISSLE;;projectilesFb}TMXX;;any active? No.Q>(;;projectile sndPAUDC3;;to hardwareQCLOCK;;60 cycle clockV?;;make 30 cyclesM>;;oc}nly 0..7L>;;8..15PAUDF3;;boomerang soundTMXX8;;restore flags :;;returnX;X; Collision HandlerX; ------d}----------- X;SMASHQM1PL;;missile 1 to M>;;player 0 ship*HHITP0;;collision? Yes.4QP0PF;;player 0 to>M>;;e}playfield 2 orHLP0PL;;to any playerRFPLR1;;collision? No.\QTRIGN;;trigger optionfR>;;shield in use?pFPLR1;;Yef}s. ship safezHITP0Q>;;value for shipPDEAD;;being shot downPLR1QM0PL;;missile 0 toM>;;player 1 shipHHITg}P1;;collision? Yes.QP1PF;;player 1 toM>;;playfield 2 orLP1PL;;to any playerFHITX;;collision? No.QTRIGNq}\BWRACE BASBY[RACE1 ASMBJDOS SYSBBRACE2 ASMB:@RACE3 ASMBKRACE4 ASMB8RACE5 ASMBUNICHECKBASBQ$UNICHECKASM;;trigger optionR>;;shield in useFHITX;;Yes. ship safeHITP1Q>;;value for shipPDEAD;;being shot down r}HITX:;;return X; X; Space Boomerang Handler$ X; -----------------------. X;8 #MISFLYQMISSLE9;;missile statusB HHITs}X;;active? Yes.L QTRIGN9;;trigger valueV R>;;shots enabled` FMISF;;Yes. continuej PTRIGS9;;put shadowt :;;return~ t}X; X; Set up Launch Coordinates X; ------------------------- X; MISFRTRIGS9;;compare shadow FHITX;;same? Yes. u}PTRIGS9;;put shadow PMISSLE9;;enable missile ,;;clear carry QXPLR9;;ship X coord O>;;get ship center POLDCOL;v};X plot coord PCOLCRS9;;shot current X QYPLR9;;ship Y coord POLDROW;;Y plot coord #OLDROW;;ship top PROWCRS9;;w}shot current Y( #ROWCRS9;;plot coord2 A;;player index< FMIS1;;player 0? Yes.F X;P X; Player 0 is targetZ X; ---------x}---------d X;n QXPLR;;enemy X coordx O>;;ship center PNEWCOL;;destination X QYPLR;;enemy Y coord !MIS2;;skip ny}ext X; X; Player 1 is target X; ------------------ X; MIS1QXPLR;;enemy X coord O>;;ship center PNEWCOL;z};destination X QYPLR;;enemy Y coord MIS2PNEWROW;;destination Y #NEWROW;;ship top Q>;;init value for PROWI{}NC9;;Y increment PCOLINC9;;X increment" ;;;set carry, QNEWROW;;Y to coord6 SOLDROW;;Y from coord@ PDELTAR9;;delta Y|}J EMIS3;;shot down? Yes.T Q>;;value = -1^ PROWINC9;;move uph NDELTAR9;;get absoluter PDELTAR9;;value for| #DELTA}}R9;;delta Y MIS3;;;set carry QNEWCOL;;X to coord SOLDCOL;;X from coord PDELTAC9;;delta X EMIS4;;to right? Yes.~} Q>;;value = -1 PCOLINC9;;move left NDELTAC9;;get absolute PDELTAC9;;value for #DELTAC9;;delta X MIS4Q>;};init value for PCOLAC9;;X accumulator PROWAC9;;Y accumulator QDELTAC9;;get delta X PENDPT9;;line length Q>;;}init value for& PCOUNTR9;;draw iteration0 QDELTAR9;;get delta Y: RENDPT9;;bigger thanD DMIS5;;delta X? No.N PENDPT9};;store new valueX V?;;delta Y / 2b PCOLAC9;;X coord Accl :;;returnv X; MIS5QENDPT9;;get delta X V?;;divide by 2 }PROWAC9;;Y coord Acc :;;return2b PCOLAC9;;X coord Accl :;;returnv X; MIS5QENDPT9;;get delta X V?;;divide by 2 "$nX;x$X; Game Interrupt Service Routine$X; ------------------------------X;GISR5;;save Acc SMASH;;test col}lisions ROTOR;;animate ships#CLOCK;;increment clock,;;clear carryQUNIVS;;universe soundO>0;;change sound}PUNIVS;;replace soundPAUDF2;;make soundQENDGAM;;game end flagHGI7;;game over? No.!GI99;;end it now!X;}X; Ship Noise Generation"X; ---------------------,X;6GI7Q>;;medium grey@PCOLPF1;;set colorJA;;move X to AccT 5};;save X^$>;;neutral stickhQDEAD;;player 0 statusrHGI70;;dead? No.|&STICK;;stick to center"GI70QDEAD;;pla}yer 1 statusHGI71;;dead? No.&STICK;;stick to center GI71QSTICK;;check if eitherMSTICK;;stick pushed by}R>;;comparing w/15Q>;;rumble noiseEGI03;;both 15? Yes.QTRIGN;;trigger opt 0LTRIGN;;trigger opt 1R>};;warp speed testQ>;;loud warp soundEGI03;;warp? Yes.Q>;;med engine roar GI03PAUDC4;;make engine sndQ>};;warp frequency&EGI30;;warp? Yes.0Q> ;;normal rockets:GI30PAUDF4;;set frequencyD$>;;init value forN&VDEL;};vertical delayX2;;make X = 1bQM0PL;;missile 0 tolPM0PLS;;PL collisionsvQM0PL;;missile 1 toPM0PLS;;PL co}llisionsQTRIGN;;trigger opt 0LTRIGN;;trigger opt 1R>;;check shieldsHMOVE2;;shields on? No.QRANDOM;;ra}ndom numberM>;;only 0..31L> ;;only 32..63PAUDF4;;shield soundQ>;;value forPAUDC4;;shield volumeMOVE}2 TRIGR;;read triggerQDEAD9;;player statusFMOVEX;;dead? Yes. QTRIGN9;;trigger valueR>;;shields in use? FM}OVEX;;Yes. skip next* MISFLY;;move missile4QCLOCK;;get clock value>W?;;bit 0 to carryHDMOVE2X;;even? Yes.RQTRIG}N9;;trigger value\R>;;warp drive?fHMOVEX;;No. skip nextpX;zX; Joystick HandlerX; ----------------X;"MOVE2}XVSTICK9;;check joystickEMOVED;;stick up? No."YPLR9;;move ship up!MOVEDVSTICK9;;check joystickEMOVEL;;stick }down? No.#YPLR9;;move ship downMOVELQSHIP;;get ship typeFMOVEX;;U/D rocket? Yes.VSTICK9;;check joystickE}MOVER;;stick left? No."XPLR9;;move ship left!MOVERVSTICK9;;check joystickEMOVEX;;stick right? No.#XPLR9;;move} ship right$MOVEXQXPLR9;;ship X coord.R>0;;past left8EMOVEX3;;border? No.BQ>0;;set to borderLMOVEX3R>;;past} rightVDMOVEX4;;border? No.`Q>;;set to borderjMOVEX4PXPLR9;;save X coordtPHPOSP09;;position ship~'TEMP;;s}ave YQDEAD9;;ship statusGMOVX4;;alive? Yes.QCLOCK;;get clock valueW?;;test bit 0EMOV4;;clock odd? Yes.T}?;;restore clockM>;;max 7 brightnessPPCOLR09;;make ship colorQSCLOCK;;score snd countHMOV4;;sound on? Yes.}QCLOCK;;get clock valueM>;;make 0..7L>;;make $C8..$CF PAUDC3;;sound volumeQRANDOM;;random numberM>;;m}ake 0..31(L> ;;make 32..632PAUDF3;;weird sound<MOV4#YPLR9;;move ship downFMOVX4QYPLR9;;ship Y coordPHMOVEX6;};screen top? No.Z SCORE;;increment scoredMOVEX6R>;;screen bottom?nDMOVEX5;;No. skip nextxQDEAD9;;ship status}HMOVX6;;ship dead? No.QXPLR9;;ship X coordRXSTRT9;;compare w/startFMOVX6A;;equal? Yes.#XPLR9;;move ship righ}tDMOVX6;;ok? Yes. else"XPLR9;;move ship left"XPLR9;;move ship leftHMOVX6;;skip nextMOVX6AQ>;;value for}PDEAD9;;working shipPHITCLR;;clr collisionsQPCOLRS9;;value forPPCOLR09;;ship colorQSCLOCK;;score snd clock}HMOVX6;;sound on? Yes."PAUDC3;;zero sound,MOVX6Q>;;value for6MOVEX5PYPLR9;;init Y coord@(>;;ship 1?JW?;};carry=1 if Yes.TPGRPX;;PM graphic pntr^DMOVEX7;;coord even? Yes.hQVDEL;;vertical delayrLVDMSK9;;delay mask|PV}DEL;;new V.delayMOVEX7A;;move X to Acc 5;;save X,;;clear carryQDEAD9;;ship statusFMOVX7A;;ship dead? Yes.}QRANDOM;;random numberM>;;make 0..15LPCOLRS9;;add ship colorPPCOLR09;;new ship colorQTRIGN9;;check trigger}R>;;for shields;;;set carryFMOVX7A;;shields? Yes.,;;clear carryQPCOLRS9;;ship colorPPCOLR09;;set color&}MOVX7A%> ;;do 10 bytes0$> ;;rocket offset:QSHIP;;get ship typeDFMOVEXD;;rocket? Yes.N$>;;saucer offsetX MO}VEXDQSHIPS9;;ship graphicbDMVXD;;shields on? No.lMRANDOM;;shield effectvMVXDP@GRPX7;;put ship0;;graphic index}1;;PM indexIMOVEXD;;done? No. 7;;pull X>;;move Acc to XQMISSLE9;;missile statusFMVXDM;;active? No.%>;;}missile launcherQ>;;no shot graphicP@GRPX7;;put ship#MVXDM%TEMP;;restore Y index0;;next shipGMOVEX0;;d}one? Yes.!MOVE2;;No. continue  MOVEX0QVDEL;;V.delay shadowPVDELAY;;vertical delay QENDGAM;;game status*FMOVX}E2;;game over? Yes.4 TIMER;;decrement time>IGI9;;time up? No.HQ>N7C;;zero graphicRPTRAM;;minutes display\}PTRAM ;;10 sec displayfPTRAM ;;seconds displaypPTRAM ;;.1 sec displayzMOVXE2Q>y;;goto attractPATRACT;;in} 30 secondsQ>;;get zeroPENDGAM;;end gamePAUDC3;;sound offPAUDC4;;sound offX;X; Comet Mover RoutineX}; -------------------X;GI97;;pull X>;;move Acc to XGI99QHINC;;comet H speedMCLOCK;;mask with clock FGI9}1;;move comet? Yes. GI907;;restore Acc 9;;return$ GI91QCOMETF;;comet status. FGI90;;active? No.8 C;;move Y to AccB} 5;;save YL A;;move X to AccV 5;;save X` QHPOS;;comet H coordj MVINC;;and w/V speedt HGI5;;move vert? No.~ QVPOS;;}comet V coord ,;;clear carry OVDIR;;add V direction M>;;make 0..127 only PVPOS;;replace V coord X; X; Draw Co}met Graphics X; ------------------- X; GI5%> ;;do 14 bytes $VPOS;;comet V coord GI0QRANDOM;;random number M}COMETM8;;mask w/comet PPM29;;put player 2 QRANDOM;;random number MCOMETM8;;do same thing PPM39;;put player 3( 2;};inc player addr2 A;;move X to Acc< M>;;make 0..127F >;;replace XP 1;;dec byte countZ IGI0;;pic done? No.d QRANDOM;};random numbern M>;;color onlyx L>;;brightness 4 PPCOLR2;;player 2 color QRANDOM;;random number M>;;color onl}y L>;;brightness 8 PPCOLR3;;player 3 color ,;;clear carry QHPOS;;comet H coord OHDIR;;add H direction PHPOS};;new H coord PHPOSP2;;player 2 H pos PHPOSP3;;player 3 H pos PCOMETF;;non 0 = enabled X; X; Generate Comet Soun}d X; -------------------- X;" #CSOUND;;comet snd freq, QENDGAM;;game status6 FGIS;;game over? Yes.@ QCSOUND;;come}t snd freqJ R>};;value < 125T EGI2;;No. skip next^ V?;;freq/2h V?;;freq/4r PAUDF1;;set frequency| R>;;past peak? }DGI2;;No. skip next N>;;reverse volume GISPAUDC1;;set volume GI27;;pull X >;;move Acc to X 7;;pull Y ?;;mo}ve Acc to Y 7;;pull Acc 9;;return X; X; Joystick Trigger Processor X; -------------------------- X; TRIGRQSTR}IG9;;get trigger V?;;move to carry ETRIGX;;pressed? No.& QTRIG;;trigger option0 TRIGXMDEAD9;;ship status: RTRIGN9};;same as last?D FTRIG2;;Yes. skip nextN PHITCLR;;clr collisionsX TRIG2PTRIGN9;;trig optionb X;l X; Missile Mover Ro}utinev X; --------------------- X; QMISSLE9;;missile status FMMX;;fired? No. QROWCRS9;;missile Y coord HMM0;;z}ero? No. PMISSLE9;;disable missile MMX:;;return X; MM0,;;clear carry QDELTAR9;;add delta Y OROWAC9;;to Y Acc} PROWAC9;;new Y Acc RENDPT9;;cmp w/endpoint DMM1;;change Y? No. SENDPT9;;sub endpoint PROWAC9;;new Y Acc value} ,;;clear carry* QROWINC9;;add shot Y inc4 OROWCRS9;;to Y coord> PROWCRS9;;new Y coordH MM1,;;clear carryR QDELTA}C9;;add delta X\ OCOLAC9;;to X Accf PCOLAC9;;new X Accp RENDPT9;;cmp w/endpointz DMMP;;change X? No. SENDPT9;;sub }endpoint PCOLAC9;;new X Acc value ,;;clear carry QCOLINC9;;add shot X inc OCOLCRS9;;to X coord PCOLCRS9;;new X }coord MMPQCOUNTR9;;iteration cnt FMMP1;;cnt done? Yes. V?;;cnt div 2 L>;;weird sound PAUDC3;;make sound FX }QCOUNTR9;;get cnt again N>;;very weird FXT?;;times 2T?;;times 4T?;;times 8$PAUDF3;;set frequency."COUNTR9};;decrement cnt8MMP1QCOLCRS9;;shot X coordBPHPOSM09;;PM horiz posLQROWCRS9;;shot Y coordVV?;;2 line res`DMM00;};even line? Yes.j5;;save PM Y coordtQVDEL;;VDELAY shadow~LVDMSK9;;odd scan linePVDEL;;new shadow val7;;rest}ore Y coordMM00L>4PMM;;missiles startPGRPM;;set pointer loQM0PLS9;;test if shot hitMMCMSK9;;comet or other}HMME;;ship? Yes.QCOLCRS9;;shot Y coordFMME;;off scrn? Yes.C;;move Y to Acc 5;;save Y%>;;4 pic bytesMM}01Q@GRPM7;;current pic MMISMSK9;;erase old picPTEMPM;;save tempQMIMAGE8;;new pic data((>;;player 1 shot?2H}MM03;;No. skip next<T?;;shift byte twoFT?;;bits to leftPMM03LTEMPM;;add saved dataZP@GRPM7;;new shot picd1;;dec }pic indexnIMM01;;pic done? No.x7;;restore Y?;;move Acc to Y :;;returnX;X; Erase Current ShotX; -----------}-------X;MMEQ>;;get zero valuePMISSLE9;;kill shotC;;move Y to Acc 5;;save Y%>;;do 4 bytesMME2Q@GR}PM7;;old shot picMMISMSK9;;erase shotP@GRPM7;;replace pic1;;next byteIMME2;;done? No."QM0PLS9;;cmp collisio}ns,MMCMSK9;;w/all but own6FMME3;;score point? No.@ SCOREM;;inc scoreJMME37;;pull YT?;;move Acc to Y^ :;;return}JnX;xX; Initialize PlayfieldX; --------------------X; PLAYGM AUDOFF;;turn snd offPHITCLR;;clr collisions}Q>;;value forPDEAD;;ship 1 alivePDEAD;;ship 2 aliveQ>@;;value toPNMIEN;;enable VBI'sQ>PAGES;;p}ages to zeroPTEMP;;save in counterQ>4DRAM;;display addr loPGRPAGE;;display pntr loQ>5DRAM;;display addr hi}PGRPAGE;;displa pntr hiQ>5PMM;;PM addr hi"PGRPM;;PM pointer hi,Q>!;;value for6PGPRIOR;;mulit-color PL@}PAUDF4;;engine soundJQ>;;value forTPSIZEP2;;double width^PSIZEP3;;comets enabledhPENDGAM;;game onrQ>c;;max} score value|PSCORES;;player 1PSCORES;;player 2$>;;move 25 bytesPLA3QTRAMI9;;from TRAMIPTRAM9;;to TRA}M0;;dec indexIPLA3;;done? No.Q>5PM0;;player addr hiPGRPX;;pntr hi byte SCRCLR;;clear inverseQ>;;va}lue forPSIZEM;;missile sizesQ>;;get zeroPHPOS;;comet X coordPFLASHF;;inverse flagPCOMETF;;comet flagP}ATRACT;;attract mode&PSCLOCK;;score sound0PMISSLE;;missile 0 flag:PMISSLE;;missile 1 flagD?;;zero Y indexNP}LA0P@GRPAGE7;;scrn byte=0X3;;inc Y indexbHPLA0;;page done? No.l#GRPAGE;;do next pagev"TEMP;;page countH}PLA0;;all done? No.Q>;;init Y coord ofPYPLR;;ship 1PYPLR;;ship 2C;;get zeroPLA1PPMM8;;zero missiles}PPM08;;player 0+1PPM28;;player 2+33;;next byteHPLA1;;page done? No. RANFIL;;put asteroids$>;;do 2 playe}rsPLA11QXSTRT9;;ship X startPHPOSP09;;set hardware PXPLR9;;and shadow0;;next ship IPLA11;;done? No.*2;;ma}ke it a one4&COLOR2;;black>&TEMP;;zero temporaryHQ>.;;value forRPSDMCTL;;P/M enable\PCOLOR1;;bright orangef}Q>5PM;;set up P/MpPPMBASE;;base addresszQ>;;value toPGRACTL;;enable P/MQ>;;green forPPCOLR0;;first shi}pQ>4;;red/orange forPPCOLR1;;second shipQ>4GISR;;DLI addr loPVDSLST;;DLI pntr loQ>5GISR;;DLI addr hiP}VDSLST;;DLI pntr hiQ>4DISPG;;DL addr loPSDLSTL;;DL pntr loQ>5DISPG;;DL addr hiPSDLSTL;;DL pntr hiQ>};;value toPNMIEN;;enable DLI'sX;$$X; Game Loops Here, Loops Here....$X; ------------------------------8X;B#ASHI}FT LDGRRT;;set up pointersLWTEMP;;get saved carryVDART0;;bit #1=0? Yes.`Q@GRPAGE7;;get bytejL>;;set high bit}t,;;clear carry~DART2;;skip nextART0Q@GRPAGE7;;get byteART2W?;;rotate rightP@GRPAGE7;;replace byte3;;nex}t byteHART0;;page done? No.#GRPAGE;;inc page addr"TEMP;;dec page countHART0;;pages done? No.Q>PAGES};;pages to rotatePTEMP;;put someplaceQ>4ASTL;;area to shiftPGRPAGE;;gr pntr loQ>PAGES5ASTL;;hi addr }PGRPAGE;;gr pntr hiALF11;;dec Y indexQ@GRPAGE7;;get graphic(U?;;move to left2P@GRPAGE7;;replace byte<C;;t}est Y indexFHALF1;;Zero? No.P"GRPAGE;;dec hi addrZ"TEMP;;dec page countdHALF1;;pages done? No.nUTEMP;};save carry bitxPGRP1;;zero low bytesPGRP2;;of these threePGRPAGE;;page zero pntrsQ>5ASTL;;scrn lf addr hiP}GRP1;;scrn fl pntr hiQ>5ASTR;;scrn rt addr hiPGRP2;;scrn rt pntr hiQ>5DRAM;;display addr hiPGRPAGE;};displa pntr hiQ>4DRAM;;w/offset loPGRP20P;;offset pntr loQ>5DRAM;;w/offset hiPGRP20P;;offset pntr h}i$>L;;76 scan linesORA0%>;;do 20 bytesORA1Q@GRP17;;to left fieldL@GRP27;;to right field"P@GRPAGE7;;lf h}alf scrn,P@GRP20P7;;rt half scrn61;;dec index@IORA1;;line done? No.JQGRP1;;lf field loT,;;clear carry^O>;;20} byte offsethPGRP1;;do next line ofrPGRP2;;asteroid fields|DORA2;;overflow? No.#GRP1;;inc left, right#GRP}2;;asteroid pntrsORA2,;;clear carryQGRPAGE;;graphic addr loO>(;;line offsetPGRPAGE;;new lo addrDORA3;;}overflow? No.#GRPAGE;;inc hi addrORA3,;;clear carryQGRP20P;;gr addr2 loO>(;;line offsetPGRP20P;;new lo} addr2DORA4;;overflow? No.#GRP20P;;inc high addr2ORA40;;decrement indexHORA0;;done? No.& CONC;;check co}nsole0DFLASH;;OPTION key? No.:!STOPTS;;run option menuDX;NX; Inverse Universe HandlerXX; ------------------------}bX;lFLASHW?;;START -> carryvDFL0;;START pressed?!PLAYGM;;Yes. restartFL0QUNIV;;univ flagFCOMET;;inverse?} No.QFLASHF;;flash flagFTRYFLA;;flash on? No. REVSCR;;flash screen"FLASHC;;decrement countQENDGAM;;game o}ver flagFFL1;;game over? Yes.QFLASHC;;flash countV?;;make volumeL>;;make pure toneFL1PAUDC2;;universe so}undQFLASHC;;flash count FFLAEND;;done? Yes.T?;;times 2 T?;;times 4*T?;;times 84N>;;flip bits>PUNIVS;;sav}e univ soundHHCOMET;;continueRX;\SCRCLRQREVF;;reverse flagfW?;;check bit 0pDSC9;;zero? Yes.zREVSCR$>;;do c}olors 0..4REV0Q>;;flip brightnessNCOLOR09;;of colorsPCOLOR09;;replace values0;;decrement indexIREV0;;don}e? No."REVF;;clear flagSC9:;;returnX;!TRYFLAQRANDOM;;random numberM>?;;make 0..63HCOMET;;do flash? No.} REVSCR;;Yes. flash scrnQ>;;value for PFLASHC;;flash count PFLASHF;;flash flag HCOMET;;continue$ X;. "FLA}ENDPFLASHF;;flash univ off8 PAUDC2;;flash sound offB X;L X; Comet MoverV X; -----------` X;j COMETQCOME;;comet flag}t FCOMETX;;comets? No.~ QCOMETF;;comet on flag FTRYCOM;;on? No. COMETX!ASHIFT;;continue X; !TRYCOMQRANDOM;;ra}ndom number M>?;;make 0..63 HCOMETX;;enable? No. PHINC;;comet H speed=0 >;;initialize X=0 TRY0PPM29;;clr playe}rs 2+3 0;;decrement index HTRY0;;done? No. PHPOSP2;;zero players 23 PHPOSP3;;horizontal pos PCSOUND;;zero comet} snd TRY5QRANDOM;;random number M>;;make 0..3( R>;;allow only 0..22 ETRY5;;3? Yes, repeat< PVDIR;;save 0..2F }"VDIR;;make -1..1P QRANDOM;;random numberZ M>;;make 0..3d >;;use as indexn Q>;;init incrementx TRY6V?;;divide by }2 0;;decrement index ITRY6;;done? No. PVINC;;vert increment QENDGAM;;end game flag FTRY7;;game over? Yes. Q>};;No. make sound TRY7PAUDC1;;comet sound QRANDOM;;random number M>?;;make 0..63 O>;;sorta 16..79 PVPOS;;ver}t start pos $>;;value -2 &COMETF;;comet on flag QRANDOM;;random number ITRY1;;flip a coin! $>;;value +2" T}RY1&HDIR;;horiz direction, QRANDOM;;random number6 ICOMETX;;another coin!@ #HINC;;change speedJ !ASHIFT;;continueT }X;^ X; Relocate programh X; ----------------r X;| RELOCQ> ;;$2000 load addr PGRP1;;from pntr hi Q>;;to $1000 }addr PGRP2;;to pntr hi >;;move 16 pages Q>;;value for PGRP1;;from pntr lo PGRP2;;to pntr lo ?;;zero index} REL0Q@GRP17;;from byte P@GRP27;;to byte 1;;dec index HREL0;;page done? No. #GRP1;;inc from hi #GRP2;};inc to hi 0;;page count HREL0;;done? No.& !RIS;;run program0 X;: ;;RUN addressD  RELOCN X;X #GRP2;s12`vDSDATHEXLINDATLIDDBYTPASCHKSUTOTAIN@} *** UNICHECK ***I @ 1(MAKE CASSETTE (0), OR DISK (1)5}I!@@ C BC0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,10,11,12,13,14,15(r;@,9@",/- }@"3"<68,-@ L6-A V#A` A r( CHECKING DATA286-%@(LINE:!"8B:,@ }A <F%6-F:A,%F:A,$AV+C(LINE  MISSING!FFq-@@@56-@:7<,,&@ }H[6-@:7%@<%@,,&@Hq6-8,$@%8,P."@*@ $". @PZ% 6-% }!A %6-&Ad  ""@Pn A x F:A,@A "Ap( }A`*@A$)*@@<*@A%O*@@b*@ATu*@@P}@<-@@f**@. 9@<(Ag+("INSERT DISK WITH DOS, PRESS }RETURN8;@,<g@@ D:AUTORUN.SYS*@AU)*@AU<*@}O*@@Hb*@Avu*@@Q A{((READY CASSETTE AND PRESS RETURNH@@}A(C:R#A0f-@@j"w*@{ M(( WRITING FILE#6-@/6-A 9#A}C A M @P(BAD DATA: LINE ..0,8,243,47,158,50,169,60,141,2,211,24,96dd000000000E0600000E060E064C}3E07A00160A20FB5209DD206CA10F8A9018DC20660A20FBDD2069520CA10F860,623ddA5CF8DCE06A5CE8DCF06A5CD8DD00620E206A99BAED106E002F}014A20B8E4203A2008E48038E49032056E48CC2,922dd0660AEB9069D0001EEB906AEB906E026F004C99BD0EBA20BBDAD069D0003CA10F7A9008DB906}2059E48CC206A2,164dd27A9209D0001CA10FAA99B8D260160ADF006850AADF106850BADF206850CADF306850D4C74E440015780000105,596dd0}028004E0000204154414400000000010A64011000000001000000000000000000000000000000000000000000,157dd004C00003D5F735D019A010000}00000000000000000000000000000000000020FFFFD8ADEC068DE7028580ADED,971$dd068DE8028581ADF406850AADF506850BA000B91A03C900F005C}8C8C8D0F4A900991B03A906991C03A955991A03,767.dd4C00A008201206A9008DCD0685CD85CE85CF85D085D1A9028DC1068DCC06A5218DD106D00C08}201206ADCC06D0,5798dd03202D0620220628ACC206600885D485D5201206A9008DBF068DC006A202D8A5D5DDC306901D38FDC30685D5F8,303BddA}DBF06187DC6068DBF06ADC0067DC9068DC0061890DBCA10D8AECC06F020A5D4204106A5D4C920D015A9008DCC,716Ldd06A90485CCA6CCBDBA06204106}C6CC10F4AEC106F8ADBF061865D085D0A5D16DC006290F85D1CAD0ECEEC106AD,748VddC106C904D005A9018DC106A5D4C99BF00820220628ACC20660A}5D01865CD85CDA5D165CE85CEA5CF690085CFD8,530`ddA9008DCE06A5D18DCF06A5D08DD00620E206A92C204106A90085D085D1A9028DC106EECD06AD}CD06C90FD0B820,924jdd2D06A90085CD85CE85CF8DCD06A9018DCC06D0A3A90085CB85CCA4CCB9CE064A4A4A4AD004A6CBF007E6CB0930,626tdd2}04106A4CCB9CE06290FD008C002F004A6CBF007E6CB0930204106E6CCA5CCC903D0CA60A9018509A90685CEA9,921~dd3085CCA90085CB85CD8D4402A8}B1CB91CD88D0F9ADE70285CDADE80285CEA93185CCA201A000B1CB91CD88D0F9,542ddE6CEE6CCCA10F0ADE70285CD186DE5068D0006ADE80285CE690 }08D0106A5CD186DE6068D0206A5CE69008D0306,642ddA5CD186DE7068D0606A5CE69008D0706A5CD186DE8068DE306A5CE6DE9068DE406A5CD186DEA!}068DEC06A5CE6D,980ddEB068DED06A5CD1869038DEE06A5CE69008DEF06A509C901D030A002A50D8DF30691CD88A50C8DF20691CDA50A,293dd8"}DF006A50B8DF106A5CD850CA5CE850DA9968DF406A9068DF5066CEE06A0028409A90691CD88A91191CDA5CD85,908dd02A5CE8503A9718DF406A9E48D#}F5066CEE06000000000000000000000000000000000000000000000000000000,231D:UNICHECK.BAS08dd02A5CE8503A9718DF406A9E48D['dEIn X;UNICHECKxX;Universal Checksum ProgramX;X;by Tom Hudson, July 1984X;ANALOG ComputingX;X;page z"%}ero equatesX;LEAD0;;leading 0 flagPRTIX;;# print indexTOTLO;;BCD chksum total TOTMD TOTHI"&}CHKLO;;BCD checksum CHKHIBYTE;;incoming charBYTE2;;incoming charX;"X;zero-page setup pointers"'},X;6 FROM@ TOJX;TX;Program equates^X;hCASINI;;cass init vectorrBOOT? ;;boot device|DOSVEC ;"(};DOS run vectorDOSINI ;;DOS init vectorZIOCB ;;zero page IOCBICDNOZ!;;device # 1/2LOMEM;;BASIC lo me")}moryPRTBUF;;my print bufferCOLDSTD;;cold start flagMEMLO;;low memory ptrDDEVIC;;SIO device #"*}HATABS;;handler tablesICCOMB;;IOCB commandICBLENH;;CIO buf lengthCIOVV;;CIO vectorSIOVY;;SI"+}O vectorWARMSVt;;warm startX;!X;This code is placed at $3000&"X;then moved to page 6 for easy0X;subroutine acc",}ess:X;DNX;XX;UNICHECK entry tablebX;lUHTBL ;;open filevUC ;;close file NOHANUW ;;write f"-}ile NOHAN NOHAN!OPEN;;init vectorNOHAN%>;;operation OKMYRTS:;;return! SAVE$>SZIOCBQZIOC".}B9;;save thePZIOBAK9;;calling IOCB 0;;data ISZIOCBQ>;;set up good...PMYSTAT;;return status :;;and exit"/}RESTOR$>  RZIOCBQZIOBAK9;;restore the*PZIOCB9;;calling IOCB4 0;;data> IRZIOCBH:;;and exitRX;\X;print checks"0}um line totalfX;p PLTOTLQTOTHI;;set up chksumzPTOT0;;print area withQTOTMD;;total PTOT1 QTOTLO PTOT2 "1}JTOTL;;print the amountQ>;;get CR...X;X;print char in A regX;"PBYTE$OUTPUT;;get output unit(>;;printe"2}r?FPRINTR;;yes!$> ;;output mode &ICCOM$>;;zero buffer&ICBLEN;;length (char in$&ICBLEN;;accumulator)"3}. CIOV;;print to screen8'MYSTAT;;save statusBPRTXIT:;;and exitL!PRINTR$PBUFIX;;get buf indexVPPRTBUF9;;put cha"4}r in buf`#PBUFIX;;next buf indexj$PBUFIX;;get indext(>&;;end of buffer?~FPRNTIT;;yes!R>;;carriage return?"5}HPRTXIT;;no!PRNTIT$> ;;copy printer...SPLPQPCOMND9;;commands...PDDEVIC9;;to SIO area0;;more bytes?ISPLP"6};;yes!Q>;;zero out...PPBUFIX;;buffer index SIOV;;print the line!'MYSTAT;;save status$>';;now clear..."7}Q> ;;print buffer CPBUFPPRTBUF90 ICPBUF(Q>;;set up CR2PPRTBUF&;;in buffer<:;;and exit!FMYDVECQDVSAV"8}E;;restore...PPDOSVEC;;DOS vectorZQDVSAVEdPDOSVECnQDISAVE;;restore...xPDOSINI;;DOS init vectorQDISAV"9}EPDOSINI!WARMSV;;system reset!X;X;miscellaneous dataX;PCOMND @;;printer ;;unit #1 W;;"W"":} = write ;;output PRTBUF;;buffer address ;;timeout (;;buffer length N;;normal print ;;unused PB";}UFIX "PDATA A ATADA,BCDBYT =6X @ MYSTAT JDECTBL = =dTBCDADL ==^BCDADH ==h LF"<}LAG r LCOUNT | TOT0  TOT1  TOT2  OUTPUT "ZIOBAK ======= ======="=}X;X;JMP vector for subroutineX;JTOTL!;;to PTOTALX;X;Relocation factorsX;OPNDLO 4OPENSTART">}CLODLO 4CLOSESTARTWRTDLO 4WRITESTARTTOTDLO 4PTOTALSTART&TOTDHI 5PTOTALSTART0CENDLO 4CODEN"?}DSTART:CENDHI 5CODENDSTARTDNEWMLL ;;new MEMLO...NNEWMLH ;;addressXJMPDVL ;;device load...bJMPDVH "@};;addresslDVSAVE =;;DOSVEC savevDISAVE =;;DOSINI saveMYDOS =;;my DOSVEC"FILLER ======="A} =X;$X;This section is placed at $3100X;then moved down to the oldX;MEMLO location.X;X;install U: d"B}evice handlerX;START ;;init DOSDEVICE-;;no decimal modeQNEWMLL;;alter the...PMEMLO;;low memory... PL"C}OMEM;;pointers QNEWMLH  PMEMLO* PLOMEM4QMYDOS;;re-point DOSVEC> PDOSVECH QMYDOSRPDOSVEC\%>;;"D}look for slotfUINSLPQHATABS8;;get entrypR>;;open?zFGOTLOC;;yes!3;;point to... 3;;next... 3;;entryHUINSL"E}P;;and keep lookingGOTLOCQ>4UHTBL;;set up...PHATABS8;;handler...Q>5UHTBL;;in the...PHATABS8;;device ta"F}bleQ> U;;call it U: PHATABS8!;;go to BASIC!X;X;UNICHECK 'OPEN' code X; OPEN6  SAVE;;save proc stat$"G} Q>;;zero out.... PLCOUNT;;line counter8 PTOTLO;;checksum totalB PTOTMDL PTOTHIV PCHKLO;;checksum` PCHKHIj Q>"H};;init...t PX;;multiplier~ PLFLAG;;new line flag QICDNOZ;;get U1/U2 # POUTPUT;;1=scrn 2=printer HALLDUN;;OPEN "I}done! X; X;UNICHECK "CLOSE" code X; CLOSE6  SAVE;;save proc stat QLFLAG;;new line? HALLDUN;;yes!  PLTOTL"J};;print last tot. ALLDUN RESTOR;;restore proc 8 %MYSTAT;;set status :;;all done! X;( X;UNICHECK "WRITE" code2 "K}X;< WRITE6;;save proc statF PBYTE;;save incomingP PBYTE2;;byte in 2 placesZ  SAVE;;save IOCB stuffd Q>;;clear out."L}..n PBCDBYT;;BCD byte valuex PBCDBYT $>;;this routine BCDLP-;;converts the QBYTE2;;binary byte RDECTBL9;;"M}value to BCD DNXTDIG;;for easier ;;;handling SDECTBL9;;the BCD value PBYTE2;;is in BCDBYT <;;and BCDBYT+1 QBC"N}DBYT , OBCDADL9 PBCDBYT QBCDBYT OBCDADH9 PBCDBYT" ,;;force branch,, DBCDLP;;loop back!6 NXTDIG0;;"O}BDC conv done?@ IBCDLP;;no, loop back!J $LFLAG;;new line?T FNOTNEW;;no!^ QBYTE;;print byte toh  PBYTE;;output devic"P}er QBYTE;;get byte again| R> ;;space? HNOTNEW;;no! Q>;;reset new line PLFLAG;;flag Q>;;now print the PPR"Q}TIX;;word DATA to "PDATLP$PRTIX;;the output unit QPDATA9;;get byte,  PBYTE;;print it! "PRTIX;;more bytes? IPDA"R}TLP;;yup! NOTNEW$X;;get multiplier <;;go to decimal CKADLPQBCDBYT;;add the BCD ,;;byte value to OCHKLO;;the ch"S}ecksum PCHKLO;;amount& QCHKHI;;the AND #$0F0 OBCDBYT;;is a modulo: M>;;1000 operation,D PCHKHI;;so chksum < 10"T}00N 0;;add it again?X HCKADLP;;yes!b #X;;inc multiplierl QX;;get mult valuev R>;;=4? HXOK;;no, it's less. Q>"U};;>3, reset it PX;;to 1 XOKQBYTE;;get byte again R>;;end of line? FEOL;;yes! EXIT RESTOR;;restore IOCB 8;"V};restore proc. %MYSTAT;;set status :;;exit! X; X;end of line, print checksum X; EOLQCHKLO;;add checksum ,;;t"W}o checksum OTOTLO;;total PTOTLO* QCHKHI4 OTOTMD> PTOTMDH QTOTHIR O>\ PTOTHIf -;;no more decimalp Q>;;p"X}ut checksum inz PTOT0;;print work area QCHKHI;;(TOT0-TOT2) PTOT1 QCHKLO PTOT2  JTOTL;;print checksum Q>,;"Y};get a comma  PBYTE;;print it Q>;;reset checksum PCHKLO;;to zero PCHKHI Q>;;reset multiplier PX;;to 2 #"Z}LCOUNT;;1 more lineQLCOUNT;;get # of linesR>;;done 15?HEXIT;;no, leave!$ PLTOTL;;print cksum tot.Q>;;zer"[}o out8PTOTLO;;checksum totalB PTOTMDL PTOTHIVPLCOUNT;;and line count`Q>;;set lflag to 1jPLFLAG;;(new cksum l"\}ine)tHEXIT;;and exit!~X;X;print checksum to screen,X;with zero-suppressionX;PTOTALQ>;;reset leading 0P"]}LEAD0;;indicatorPPRTIX;;and print indexPTLP%PRTIX;;get indexQTOT08;;and work byteV?;;shift overV?;;the up"^}perV?;;BCD digitV?HGOTP1;;it's not zero $LEAD0;;print leading 0?FDIGIT2;;no! GOTP1#LEAD0;;cancel 0 supp."_}(L>0;;convert to ASCII2 PBYTE;;and print it!<"DIGIT2%PRTIX;;get print indexFQTOT08;;get the bytePM>;;get low "`}BCDZHGOTP2;;it's not zerod)>;;last digit?nFGOTP2;;yes, print it!x$LEAD0;;suppress zero?FNXTPT;;yes! GOTP2"a}#LEAD0;;cancel 0 supp.L>0;;conv to ASCII PBYTE;;print it!NXTPT#PRTIX;;next byteQPRTIX;;get pointerR>;;"b}done all 3?HPTLP;;no!:;;yes, return!X;X;1-shot vector changerX;(erased after use)X;CODEND;new MEMLO h"c}ere!DISKINQ>;;disk entry, setPBOOT?;;BOOT flag"CASSINQ>;;move code...,PTO;;to $06006Q>0;;from $3000@"d} PFROMJQ>T PFROM^PTOhPCOLDST;;clear cold startr?;;put 0 in Y reg|MOVE1Q@FROM7;;move code! P@TO71"e} HMOVE1QMEMLO;;move rest...PTO;;of code...QMEMLO;;to old MEMLO PTOQ>1;;from $3100 PFROM$>"f};;move 2 pagesMOVE21%>;;move loopMOVE22Q@FROM7 P@TO71 HMOVE22#TO;;next page& #FROM00;;all"g} done?:IMOVE21;;no!DQMEMLO;;ge old MEMLO,NPTO;;save it,X,;;add OPEN offsetbOOPNDLO;;and save inlPUHTBL;;hand"h}ler tablevQMEMLO;;also hi byte PTOO> PUHTBLQTO;;now relocate,;;CLOSE vectorOCLODLO;;and put"i} inPUC;;handler table QTOO> PUCQTO;;now relocate,;;WRITE vectorOWRTDLO;;and put inPUW;;ha"j}ndler table  QTOO>  PUW*QTO;;now relocate4,;;total print>OTOTDLO;;address andHPJTOTL;;put in JMP"k}RQTO;;vector (JTOTL)\ OTOTDHIf PJTOTLpQTO;;now relocatez,;;code endOCENDLO;;address andPNEWMLL;;sav"l}e in theQTO;;new low memoryOCENDHI;;hold areaPNEWMLH;;(NEWMLL&H)QTO;;now set up,;;handler installO>"m};;vector and savePJMPDVL;;in JMPDVL&H QTOO> PJMPDVHQBOOT?;;get boot flagR>;;disk?HCASSET;;no!"n}%>;;DOS loaded$QDOSINI;;get DOS init.PDISAVE;;save it,8P@TO7;;put in my JSRB1;;repeat forLQDOSINI;;h"o}i byteV PDISAVE` P@TO7jQDOSVEC;;get old DOSVECtPDVSAVE;;and save it~QDOSVECPDVSAVEQTO;;get my star"p}tPDOSINI;;address and putQTO;;in DOS init!PDOSINIQ>4MYDVEC;;replace DOSVECPMYDOS;;with my routine"q}Q>5MYDVEC;;to removePMYDOS;;the U: handler!@JMPDVL:;;go install U:CASSET%>;;cass loaded 'BOOT?Q>5MY"r}RTS;;get RTS address P@TO7;;& put in my JSR1 Q>4MYRTS( P@TO72QTO;;get my start<PCASINI;;address and putFQ"s}TO;;in cass init!PPCASINIZQ>q;;point DOSVEC...dPMYDOS;;to memo padnQ>x PMYDOS!@JMPDVL:;;go instal"t}l U:;;in cass init!PPCASINIZQ>q;;point DOSVEC...dPMYDOS;;to memo padnQ>x PMYDOS!@JMPDVL:;;go instal